/**
 * \file   bootloader.h
 * \author fabianjsm
 * \date   Noviembre de 2011
 * 
 *  Este archivo es parte del proyecto MPHB, aplicación que se comunica
 * a traves del puerto USB con el bootloader en un microcontrolador PIC
 * de la familia 18, 24 o 32 para programarlo utilizando el protocolo
 * HID-Bootloader de Microchip.
 * 
 *  El codigo fuente esta diponible a traves del repositorio SVN de
 * Google:
 * 
 *      http://mphb.googlecode.com/svn/trunk
 * 
 * Fabian Jesus Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 * Alumno de Ingenieria Electronica, Universidad Nacional De Misiones
 * (U.Na.M), Facultad de Ingeniería de Obera.
 * 
 */
#ifndef	MPHB_H
#define	MPHB_H
#include <iostream>

#define STR_VERSION "0.5"

// Opciones en linea de comandos
#define OP_NUMERICO     1
#define OP_SI_NO        2
#define OP_HELP         (20 << 8)
#define OP_PID          (21 << 8) | OP_NUMERICO
#define OP_VID          (22 << 8) | OP_NUMERICO
#define OP_DETACH_USB   (23 << 8) | OP_SI_NO
#define OP_VERBOSE      (24 << 8) | OP_SI_NO
#define OP_VERSION      (25 << 8)
#define OP_DETECT_ONLY  (26 << 8)
#define OP_ERASE        (27 << 8) | OP_SI_NO
#define OP_ERASE_ONLY   (28 << 8)
#define OP_SHOW_CONFIG  (29 << 8)
#define OP_SHOW_INFO    (30 << 8)
#define OP_NO_PROGRAM   (31 << 8)

// Configuracion de la aplicacion
class config {
public:
	/* Configuracion de la aplicacion */
	bool program;
	bool erase;
	bool erase_only;
	bool detect_only; // flag: solo detecta el bootloader y termina
	bool detach;  // desconectar USB
	bool verbose; // modo verbose
	bool show_config;
	bool show_info;
};

// Parametros del bootloader, bus usb, etc.
class mphb {
public:
	libusb_device_handle *devh;
	uint16_t vid; // VendorID
	uint16_t pid; // ProductID
	
	int familia;  // PIC18, PIC24, PIC32
	int bytes_por_dir; // bytes por direccion (ancho de palabra)
	int bytes_por_pack; // bytes por paquete de programacion
};

class environment: public config, public mphb {
public:
	/* Constructor de la clase */
	environment();
	
	/* Metodos */
	void SetConfig(uint op, const char *, void *);
	void ShowConfig();
	void ShowInfo();
	
	/* variables */
	uint8_t *vData[MAX_DATA_REGIONS];
	MEMORY_REGION *reg_mem;
	int regiones; // cantidad de regiones detectadas
	std::string archivo_hex; // Nombre del archivo hex
};

#endif	/* MPHB_H */
